// utils/http.js

// 导入模块
import Request from 'luch-request'
import { useUserStore } from '@/stores/user.js'

// tabbar路径数组
const tabbarPaths = [
  'pages/index/index',
  'pages/wiki/index',
  'pages/notify/index',
  'pages/my/index',
]

const reLogin = () => {
  const pages = getCurrentPages()
  const curPage = pages[pages.length - 1]
  // 去fullPath，才能包含查询参数
  const url = curPage.$page.fullPath

  // curPage.$page.path 是不带查询参数的
  const isTabbar = tabbarPaths.includes(curPage.route)
  const type = isTabbar ? 'switchTab' : 'redirectTo'

  // 去登录之前要保存当前的url和跳转type到pinia中
  const userStore = useUserStore()
  userStore.setReturnUrl(url)
  userStore.setReturnType(type)

  // 清除用户基本信息，token就在基本信息中
  userStore.removeBasicInfo()

  uni.redirectTo({
    url: '/pages/login/index',
  })
}

// 获取Store实例（这里有可能拿不到，因为这个http.js有可能在Pinia初始化之前就被导入了）
// 在 store 中 或 vue 文件中，可以导入进来就 获取实例，在其他的位置，导入进来后，用的时候再获取实例
// const userStore = useUserStore()
// console.log(userStore, 'userStore')

export const baseURL = 'https://consult-api.itheima.net/'

// 实例化网络请求
const http = new Request({
  // 接口基地址
  baseURL,
  custom: {
    loading: true,
    loadingText: '加载中...',
    showError: true, // 是否显示错误提示
  },
})

http.interceptors.request.use(
  (config) => {
    if (config.custom.loading) {
      uni.showLoading({
        title: config.custom.loadingText,
        // 遮罩层要加上，没请求完之前，不能操作页面上其他的内容
        mask: true,
      })
    }

    const userStore = useUserStore()
    const defaultHeader = {} // 默认请求头

    if (userStore.basicInfo.token) {
      // 有token，才携带
      defaultHeader.Authorization = `Bearer ${userStore.basicInfo.token}`
    }

    config.header = {
      // 放到展开config.header之前：
      //   如果config.header中有，说明别人在发请求的时候自己设置了该请求头，那么就用别人的
      //   如果config.header中没有，就用我们自己的
      // 放到展开config.header之后：会无脑的覆盖 config.header 中的，就会一直以我们的为准
      ...defaultHeader,
      ...config.header,
    }

    // 一定要返回，类似于axios
    return config
  },
  (err) => {
    uni.hideLoading()

    return Promise.reject(err)
  }
)

http.interceptors.response.use(
  // HTTP状态码 >= 200 && < 300 才会进成功
  (res) => {
    uni.hideLoading()

    const { data } = res
    const { code, message } = data

    // 统一错误消息提示
    if (code !== 10000) {
      if (res.config.custom.showError) {
        uni.utils.toast(message)
      }
      // 为了让后续的逻辑进入失败
      return Promise.reject(res)
    }

    return data
  },
  // 其他HTTP状态码
  (err) => {
    console.log(err, 'err')
    uni.hideLoading()

    if (err.statusCode === 401) {
      // token无效，去登录
      reLogin()
    }

    return Promise.reject(err)
  }
)

// const a = 1
// const b = 2

// 导出配置好的模网络模块
// Tips：不推荐使用这种统一按需导出的语法
export { http }

// export default http
